#ifndef __PACKETBASE_H__
#define __PACKETBASE_H__

#include <string>
#include <vector>


/*
    实现一个数据包的基类 PacketBase,所有的协议层数据包基于此类进行 通讯
    1. PacketBaseHeader 作为 接收/发送 的辅助类，保存包的收发状态
    2. PacketBase  作为数据包基类（接口类），接口包括：
        1）解包      ：  n_get
        2）包流      ：  to_bytes
        3）格式化打印 ：  to_string
        4）复位接收   ：  reset_recv
     注意：由于组包的多态，所以，组包功能在 特定的 包类 实现，不作标准化接口
*/

namespace controller
{
    class PacketBaseHeader
    {
    public:
        // receive
        int len = 0, state = 0, user_size = 0, recv_len = 0;
        char *user_data = NULL;
        int framelen = 0;

        // send
        int send_size = 0;

        PacketBaseHeader() { reset(); }
        ~PacketBaseHeader() {}

        void reset()
        {
            len = state = user_size = recv_len = framelen = 0;
            user_data = NULL;
        }
    };

    class PacketBase
    {
    public:
        static const int BUFFER_MAX = 4096;

        virtual void reset_recv() = 0;                                          // 接收复位
        virtual PacketBase *on_get(char *data, int size, void *arg = NULL) = 0; // 接收数据的处理
        virtual int to_bytes(char *dataout, void **arg = NULL) = 0;             // 生成一个字节流的发送包
        virtual std::string to_string(std::string arg = "") = 0;                // 格式化包的输出

        PacketBase();
        ~PacketBase();
    };

};
#endif